`include "ascon_define.v"

module `ASCON_HASH_SH
(
    input                                        ascon_hash_clk_i,
    input                                        ascon_hash_rst_n_i,

    input                                        ascon_hash_sh_en_i,
    input                                        ascon_hash_sh_vld_i,
    input                                        ascon_hash_sh_mode_i,
    input                                        ascon_hash_sh_first_i,
    input                             [`S_W-1:0] ascon_hash_sh_s_i,

    output                            [`H_W-1:0] ascon_hash_sh_h_o,
    input                                        ascon_hash_sh_vld_o
);
//外信号

wire                                             en_p;
wire                                             vld_i_p;
wire                                             mode_p;
wire                                             first_p;
wire                                  [`S_W-1:0] s_p;
wire                                  [`H_W-1:0] h_p;
wire                                             vld_o_p;

//接口信号
reg                                   [`S_W-1:0] s1_o_r;
wire                                  [`S_W-1:0] s1_o_w;
wire                                  [`S_W-1:0] s1_i_w;

//连接接口信号

assign en_p                  = ascon_hash_sh_en_i;
assign vld_i_p               = ascon_hash_sh_vld_i;
assign mode_p                = ascon_hash_sh_mode_i;
assign first_p               = ascon_hash_sh_first_i;
assign s_p                   = ascon_hash_sh_s_i;

assign ascon_hash_sh_h_o     = h_p;
assign ascon_hash_sh_vld_o   = vld_o_p;

//接口信号 生成

assign s1_i_w                = (first_p == 1'b0) ? s1_o_r : s_p;
assign h_p                   = s1_i_w[`S_W-1:`S_W-`H_W];

always @(posedge ascon_hash_clk_i or negedge ascon_hash_rst_n_i)
begin : S1_O_R_PROG
  if (ascon_hash_rst_n_i == 1'b0)
    s1_o_r              <= {`S_W{1'b0}};
  else if (en_p == 1'b1)
    s1_o_r              <= s1_o_w;
  else
    s1_o_r              <= s1_o_r;
end

`P12_8
u_p12_8
(
    .clk_i                             (ascon_hash_clk_i                       ),
    .rst_n_i                           (ascon_hash_rst_n_i                     ),
    .p12_8_en_i                        (en_p                                   ),
    .p12_8_mode_i                      (mode_p                                 ),
    .p12_8_vld_i                       (vld_i_p                                ),
    .p12_8_s_i                         (s1_i_w                                 ),
    .p12_8_s_o                         (s1_o_w                                 ),
    .p12_8_vld_o                       (vld_o_p                                )
);
endmodule


// `include "ascon_define.v"

// module `ASCON_HASH_SH
// (
//      input                                       ascon_hash_clk_i,
//      input                                       ascon_hash_rst_n_i,

//      input                                       ascon_hash_sh_en_i,
//      input                                       ascon_hash_sh_vld_i,
//      input                                       ascon_hash_sh_mode_i,
//      input                                       ascon_hash_sh_first_i,
//      input                            [`S_W-1:0] ascon_hash_sh_s_i,

//      output                           [`H_W-1:0] ascon_hash_sh_h_o,
//      input                                       ascon_hash_sh_vld_o
// );
// //外信号

// wire                                             en_p;
// wire                                             vld_i_p;
// wire                                             mode_p;
// wire                                             first_p;
// wire                                  [`S_W-1:0] s_p;
// wire                                  [`H_W-1:0] h_p;
// wire                                             vld_o_p;

// //接口信号
// reg                                   [`S_W-1:0] s1_o_r;
// wire                                  [`S_W-1:0] s1_o_w;
// wire                                  [`S_W-1:0] s1_i_w;
// wire                                  [`S_W-1:0] s0_o_w;
// wire                                             vld_o_w;
// wire                                             vld_i_w;

// //连接接口信号

// assign en_p                  = ascon_hash_sh_en_i;
// assign vld_i_p               = ascon_hash_sh_vld_i;
// assign mode_p                = ascon_hash_sh_mode_i;
// assign first_p               = ascon_hash_sh_first_i;
// assign s_p                   = ascon_hash_sh_s_i;

// assign ascon_hash_sh_h_o     = h_p;
// assign ascon_hash_sh_vld_o   = vld_o_p;

// //接口信号 生成

// assign s1_i_w                = (first_p == 1'b0) ? s1_o_r : s0_o_w;
// assign h_p                   = s1_i_w[`S_W-1:`S_W-`H_W];
// assign vld_i_w               = (first_p == 1'b0) ? vld_i_p : vld_o_w;

// always @(posedge ascon_hash_clk_i or negedge ascon_hash_rst_n_i)
// begin : S1_O_R_PROG
//   if (ascon_hash_rst_n_i == 1'b0)
//     s1_o_r              <= {`S_W{1'b0}};
//   else if (en_p == 1'b1)
//     s1_o_r              <= s1_o_w;
//   else
//     s1_o_r              <= s1_o_r;
// end

// `P12
// u_p12
// (
//      .clk_i                            (ascon_hash_clk_i                       ),
//      .rst_n_i                          (ascon_hash_rst_n_i                     ),
//      .p12_en_i                         (en_p                                   ),
//      .p12_vld_i                        (vld_i_p                                ),
//      .p12_s_i                          (s_p                                    ),
//      .p12_s_o                          (s0_o_w                                 ),
//      .p12_vld_o                        (vld_o_w                                )
// );

// `P12_8
// u_p12_8
// (
//     .clk_i                             (ascon_hash_clk_i                       ),
//     .rst_n_i                           (ascon_hash_rst_n_i                     ),
//     .p12_8_en_i                        (en_p                                   ),
//     .p12_8_mode_i                      (mode_p                                 ),
//     .p12_8_vld_i                       (vld_i_w                                ),
//     .p12_8_s_i                         (s1_i_w                                 ),
//     .p12_8_s_o                         (s1_o_w                                 ),
//     .p12_8_vld_o                       (vld_o_p                                )
// );
// endmodule